package ch.fhnw.swa.aufgabenverwaltungswa.persistenz;

import java.io.Serializable;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.validation.constraints.Pattern;

/**
 * Entity Klasse eines Mitarbeiters
 * @author Tobias Neuenschwander
 * @author Benjamin Schatzmann
 * @author Edis Dilji
 * @author Francis Murillo
 */
@Entity
@NamedQueries({
    @NamedQuery(name = "findAllEmployee", query = "SELECT ma FROM Mitarbeiter ma")
})
public class Mitarbeiter implements Serializable {
    //**************************************************************************
    //Variablen
    //**************************************************************************
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String vorname;
    private String nachname;
    private String rolle;
    private String abteilung;
    private String adressePrivat;
    private String adresseGeschaeft;
    @Pattern(regexp = "|[0-9 +]+", message = "Ungültige Nummer.")
    private String telHandy;
    @Pattern(regexp = "|[0-9 +]+", message = "Ungültige Nummer.")
    private String telFestnetz;
    @Pattern(regexp = "|[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})", message = "Ungültige Adresse.")
    private String emailPrivat;
    @Pattern(regexp = "|[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})", message = "Ungültige Adresse.")
    private String emailGeschaeft;
    @Pattern(regexp="|(https?)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]", message = "Ungültige Adresse.")
    private String webseite;
    @ManyToMany
    @JoinTable(name = "jnd_ma_aufg",
    joinColumns = @JoinColumn(name = "ma_fk"),
    inverseJoinColumns = @JoinColumn(name = "aufg_fk"))
    private List<Aufgabe> aufgabenZugeteilt;

    //**************************************************************************
    //Getter/Setter
    //**************************************************************************
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getVorname() {
        return vorname;
    }

    public void setVorname(String vorname) {
        this.vorname = vorname;
    }

    public String getNachname() {
        return nachname;
    }

    public void setNachname(String nachname) {
        this.nachname = nachname;
    }

    public String getRolle() {
        return rolle;
    }

    public void setRolle(String rolle) {
        this.rolle = rolle;
    }

    public String getAbteilung() {
        return abteilung;
    }

    public void setAbteilung(String abteilung) {
        this.abteilung = abteilung;
    }

    public String getAdressePrivat() {
        return adressePrivat;
    }

    public void setAdressePrivat(String adressePrivat) {
        this.adressePrivat = adressePrivat;
    }

    public String getAdresseGeschaeft() {
        return adresseGeschaeft;
    }

    public void setAdresseGeschaeft(String adresseGeschaeft) {
        this.adresseGeschaeft = adresseGeschaeft;
    }

    public String getTelHandy() {
        return telHandy;
    }

    public void setTelHandy(String telHandy) {
        this.telHandy = telHandy;
    }

    public String getTelFestnetz() {
        return telFestnetz;
    }

    public void setTelFestnetz(String telFestnetz) {
        this.telFestnetz = telFestnetz;
    }

    public String getEmailPrivat() {
        return emailPrivat;
    }

    public void setEmailPrivat(String emailPrivat) {
        this.emailPrivat = emailPrivat;
    }

    public String getEmailGeschaeft() {
        return emailGeschaeft;
    }

    public void setEmailGeschaeft(String emailGeschaeft) {
        this.emailGeschaeft = emailGeschaeft;
    }

    public String getWebseite() {
        return webseite;
    }

    public void setWebseite(String webseite) {
        this.webseite = webseite;
    }

    public List<Aufgabe> getAufgabenZugeteilt() {
        return aufgabenZugeteilt;
    }

    public void setAufgabenZugeteilt(List<Aufgabe> aufgabenZugeteilt) {
        this.aufgabenZugeteilt = aufgabenZugeteilt;
    }
    
    //**************************************************************************
    //Methoden
    //**************************************************************************
    @Override
    public int hashCode() {
        int hash = 3;
        hash = 53 * hash + (this.id != null ? this.id.hashCode() : 0);
        hash = 53 * hash + (this.vorname != null ? this.vorname.hashCode() : 0);
        hash = 53 * hash + (this.nachname != null ? this.nachname.hashCode() : 0);
        hash = 53 * hash + (this.rolle != null ? this.rolle.hashCode() : 0);
        hash = 53 * hash + (this.abteilung != null ? this.abteilung.hashCode() : 0);
        hash = 53 * hash + (this.adressePrivat != null ? this.adressePrivat.hashCode() : 0);
        hash = 53 * hash + (this.adresseGeschaeft != null ? this.adresseGeschaeft.hashCode() : 0);
        hash = 53 * hash + (this.telHandy != null ? this.telHandy.hashCode() : 0);
        hash = 53 * hash + (this.telFestnetz != null ? this.telFestnetz.hashCode() : 0);
        hash = 53 * hash + (this.emailPrivat != null ? this.emailPrivat.hashCode() : 0);
        hash = 53 * hash + (this.emailGeschaeft != null ? this.emailGeschaeft.hashCode() : 0);
        hash = 53 * hash + (this.webseite != null ? this.webseite.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Mitarbeiter other = (Mitarbeiter) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }
        if ((this.vorname == null) ? (other.vorname != null) : !this.vorname.equals(other.vorname)) {
            return false;
        }
        if ((this.nachname == null) ? (other.nachname != null) : !this.nachname.equals(other.nachname)) {
            return false;
        }
        if ((this.rolle == null) ? (other.rolle != null) : !this.rolle.equals(other.rolle)) {
            return false;
        }
        if ((this.abteilung == null) ? (other.abteilung != null) : !this.abteilung.equals(other.abteilung)) {
            return false;
        }
        if ((this.adressePrivat == null) ? (other.adressePrivat != null) : !this.adressePrivat.equals(other.adressePrivat)) {
            return false;
        }
        if ((this.adresseGeschaeft == null) ? (other.adresseGeschaeft != null) : !this.adresseGeschaeft.equals(other.adresseGeschaeft)) {
            return false;
        }
        if ((this.telHandy == null) ? (other.telHandy != null) : !this.telHandy.equals(other.telHandy)) {
            return false;
        }
        if ((this.telFestnetz == null) ? (other.telFestnetz != null) : !this.telFestnetz.equals(other.telFestnetz)) {
            return false;
        }
        if ((this.emailPrivat == null) ? (other.emailPrivat != null) : !this.emailPrivat.equals(other.emailPrivat)) {
            return false;
        }
        if ((this.emailGeschaeft == null) ? (other.emailGeschaeft != null) : !this.emailGeschaeft.equals(other.emailGeschaeft)) {
            return false;
        }
        if ((this.webseite == null) ? (other.webseite != null) : !this.webseite.equals(other.webseite)) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Mitarbeiter{" + "id=" + id + ", vorname=" + vorname + ", nachname=" + nachname + ", rolle=" + rolle + ", abteilung=" + abteilung + ", adressePrivat=" + adressePrivat + ", adresseGeschaeft=" + adresseGeschaeft + ", telHandy=" + telHandy + ", telFestnetz=" + telFestnetz + ", emailPrivat=" + emailPrivat + ", emailGeschaeft=" + emailGeschaeft + ", webseite=" + webseite + ", aufgabenZugeteilt=" + aufgabenZugeteilt + '}';
    }


}
